class Observer {
    constructor(vm) {
        this.observer(vm.$data)
        this.data_agent(vm, vm.$data)
    }
    // 数据代理, 详情查看 : 02_06_
    data_agent(vm, data) {
        Object.keys(data).map(key=>{
            Object.defineProperty(vm, key, {
                get: () => data[key],
                set: new_v => data[key]=new_v
            })
        })
    }
    // 监听对象的所有数据, 详情查看 : 02_05_
    observer(data) {
        this.search_obj(data, obj=>{
            this.watch_obj(obj)
        })
    }
    // 监听对象的第一层数据, 详情查看 : 02_04_
    watch_obj(obj) {
        Object.keys(obj).map(key=>{
            let dep = new Dep()
            let value = obj[key]
            Object.defineProperty(obj, key, {
                get() {
                    Dep.target&&dep.add_watcher(Dep.target)
                    return value
                },
                set: new_v => {
                    if(new_v===value) return
                    this.observer(new_v) // 如果new_value是个obj, 那么我们也要对其进行数据监听
                    value = new_v
                    dep.notify()
                }
            })
        })
    }
    // 找出所有对象节点, 详情查看 : 02_03_
    search_obj(obj, cb) {
        let is_o = this.is_obj(obj)
        if(is_o) {
            cb(obj)
            Object.keys(obj).map(key=>{
                this.search_obj(obj[key], cb)
            })
        }
    }
    // 判断是否是对象, 详情查看 : 02_02_
    is_obj(data) {
        if (data===null) return false
        return typeof data==='object'?true:false
    }
}